package com.ssy.lingxi.enhance.controller.process;

import com.ssy.lingxi.common.controller.BaseController;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.enhance.api.model.dto.BatchExamDTO;
import com.ssy.lingxi.enhance.api.model.dto.UpdateInvoiceDTO;
import com.ssy.lingxi.enhance.constant.RoleTypeEnum;
import com.ssy.lingxi.enhance.model.dto.AddInvoiceDTO;
import com.ssy.lingxi.enhance.model.dto.CommonIdDTO;
import com.ssy.lingxi.enhance.model.qo.ProduceNoticeOrderQO;
import com.ssy.lingxi.enhance.model.vo.ProduceNoticeOrderDetailsVO;
import com.ssy.lingxi.enhance.model.vo.ProduceNoticeOrderListVO;
import com.ssy.lingxi.enhance.service.common.CommonService;
import com.ssy.lingxi.enhance.service.process.ProcessToBeAddDeliveryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;

/**
 * @menu 加工能力 - 确认生产通知单(加工企业) - 待新增加工发货单
 * @author fhj
 * @version 2.0.0
 * @date 2020/10/20
 */
@Api(tags = "加工能力 - 确认生产通知单(加工企业) - 待新增加工发货单")
@RestController
@RequestMapping("/enhance/process/toBeAddDelivery")
public class ProcessToBeAddDeliveryController extends BaseController {

    @Resource
    private ProcessToBeAddDeliveryService toBeAddDeliveryService;
    @Resource
    private CommonService commonService;

    @ApiOperation(value = "列表")
    @GetMapping(value = "/list")
    public Wrapper<PageData<ProduceNoticeOrderListVO>> list(@Valid ProduceNoticeOrderQO qo) {
        return toBeAddDeliveryService.list(qo, getSysUser());
    }

    @ApiOperation(value = "详情")
    @GetMapping(value = "/details")
    public Wrapper<ProduceNoticeOrderDetailsVO> details(@Valid CommonIdDTO dto) {
        return commonService.details(dto.getId(), RoleTypeEnum.PROCESS.getCode(), getSysUser());
    }

    @ApiOperation(value = "提交")
    @PostMapping(value = "/submit")
    public Wrapper<Void> submit(@RequestBody @Valid AddInvoiceDTO dto) {
        return toBeAddDeliveryService.submit(dto, getSysUser());
    }

    @ApiOperation(value = "审核")
    @PostMapping(value = "/exam")
    public Wrapper<Void> exam(@RequestBody @Valid CommonIdDTO dto) {
        return toBeAddDeliveryService.exam(dto, getSysUser());
    }

    /**
     * 当生产通知单新增了发货单之后, 可能发货数量填错等原因, 会在供应商新增入库单之前, 发货单可反审后进行修改。
     * 问题1：
     *      在新增发货单, 选择的发货单明细时(即是选择货品), 假如选择了A B C D 4个货品, 发货数量各为100个, 然后ABC货品选择对应要加工的A商品, D货品选择对应要加工的B商品,
     *      接着提交发货单时该生产通知单对应的发货明细即为 {A商品, 发货数量是300个}, {D商品, 发货数量是100个}
     *      这时候修改了发货单, 发货单明细货品全清空再重新选择ADE3个货品, 发货数量各为100个, ADE货品对应了C商品, 那么修改完提交后这对应的生产通知单里的发货明细为{C商品, 发货数量是300个}
     *     （经确认， 是可以这样操作， 且修改发货单只会修改发货单明细而已）
     * */
    @ApiOperation(value = "内部接口：修改发货单")
    @PostMapping(value = "/updateDelivery")
    public Wrapper<Void> updateDelivery(@RequestBody @Valid UpdateInvoiceDTO dto) {
       return toBeAddDeliveryService.updateDelivery(dto);
    }

    /**
     * 交易能力 - 进销存 - 单据管理 - 批量审核发货单
     * */
    @ApiOperation(value = "内部接口：批量审核发货单")
    @PostMapping(value = "/batchExamDelivery")
    public Wrapper<Void> batchExamDelivery(@RequestBody @Valid BatchExamDTO dto) {
        return toBeAddDeliveryService.batchExamDelivery(dto);
    }
}
